import { login, getUserDetailById, getUserInfo } from '@/api/user'
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'

// 状态
const state = {
  token: getToken(),
  userInfo: {} // 定义一个空对象，不是null,后面要开发userInfo的属性在getters里用
}
// 修改状态
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token // 设置token  只是修改state的数据  123 =》 1234
    // vuex变化 => 缓存数据
    setToken(token) // vuex和 缓存数据的同步
  },
  // 删除缓存
  removeToken(state) {
    state.token = null // 删除vuex的token
    removeToken() // 先清除 vuex  再清除缓存 vuex和 缓存数据的同步
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo } // 浅拷贝赋值对象，这样数据更新后才会触发组件的更新
  },
  //  删除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  //  定义login action 也需要参数，调用action时 传过来的参数
  //  经过axios响应处理，result就是token
  async login(context, data) {
    const result = await login(data)
    //  axios默认给数据加了一层data
    // if (result.data.success) {
    // 表示登录接口调用成功 也就是用户名密码正确
    //  现在有用户token
    //   actions修改state必须通过mutations
    context.commit('setToken', result)
    //  登录成功写入时间戳，为验证token是否过期坐准备
    setTimeStamp()
    // }
  },
  //  ========= 上面方法的另一种写法
  // login(context, data) {
  //   return new Promise(function(resolve) {
  //     login(data).then(result => {
  //       if (result.data.success) {
  //         context.commit('setToken',  result.data.data) // 提交mutations设置token
  //         resolve()  // 表示执行成功了
  //       }
  //     })
  //   })
  // }
  //  获取用户资料卡
  async getUserInfo(context) {
    const result = await getUserInfo() // 获取返回值
    const baseInfo = await getUserDetailById(result.userId) // 获取头像
    const baseResult = { ...result, ...baseInfo } // 将两个接口的内容合并
    context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex中
    return baseResult
  },
  // 登出
  logout(context) {
    // 删除token
    context.commit('removeToken') // 不仅删除了vuex中的token,而且删除了缓存中的token
    context.commit('removeUserInfo') // 删除用户信息
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
